#include <iostream>


// 普通函数与函数模板的调用规则
// 1、如果函数模板和普通函数都可以被调用，优先调用普通函数
// 2、如果普通函数和函数模板都不能被调用，可以通过空模板参数列表 强制调用函数模板
// 3、函数模板可以发生函数重载
// 4、如果函数模板可以产生更好的匹配，优先调用函数模板

void myPrint(int a, int b)
{
    std::cout << "调用的普通函数" << std::endl;
}


template<typename T>
void myPrint(T a, T b)
{
    std::cout << "调用的模板" << std::endl;
}


template<typename T>
void myPrint(T a, T b, T c)
{
    std::cout << "调用的重载" << std::endl;
}



void test()
{
    int a = 20;
    int b = 20;
    // 调用空模板参数列表，强制调用函数模板
    myPrint<>(a, b);

    myPrint(a, b, 100);

    // 如果函数模板产生更好的匹配，优先调用函数模板
    char c1 = 'a';
    char c2 = 'b';
    myPrint(c1, c2);
}

int main()
{
    test();
    return 0;
}